use sky_takeout::{
    bootstrap::{self, config, AppState},
    router,
};

#[tokio::main]
async fn main() {
    if std::env::var_os("RUST_LOG").is_none() {
        std::env::set_var("RUST_LOG", "sky_takeout=debug,sea_orm=debug");
    }
    let _ = dotenv::dotenv().ok();

    tracing_subscriber::fmt::init();

    tracing::info!(
        r#"
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//             佛祖保佑       永不宕机      永无BUG               //
////////////////////////////////////////////////////////////////////"#
    );

    let cfg = config::Configuration::from_env().unwrap();

    let db_pool = bootstrap::gen_db_pool(cfg.database.url)
        .await
        .expect("Database Could not connected");

    let redis = match bootstrap::redis_service::gen_pool(cfg.session.url).await {
        Ok(conn) => conn,
        Err(e) => {
            tracing::error!("{}", e);
            panic!("{}", e);
        }
    };

    let state = AppState { db_pool, redis };

    let address = format!("{}:{}", cfg.web.host, cfg.web.port);

    let listener = tokio::net::TcpListener::bind(address.clone())
        .await
        .unwrap();

    let routes = router::create_routes(state.clone())
        .await
        // .layer(session_layer)
        .with_state(state.clone());

    tracing::info!("http on => {}", address);
    println!(
r#"    _   (♥◠‿◠)ﾉﾞ  Axum启动成功   ლ(´ڡ`ლ)ﾞ
   / \   __  ___   _ _ __ ___  
  / _ \  \ \/ / | | | '_ ` _ \ 
 / ___ \  >  <| |_| | | | | | |
/_/   \_\/_/\_\\__,_|_| |_| |_|"#);

    axum::serve(listener, routes).await.unwrap()
}
